﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Utilities;

namespace BusinessLogicLayer
{
    public class DKTangCaManager
    {
        ActionResultAsList<DKTangCa> Parser(DataRow row)
        {
            ActionResultAsList<DKTangCa> rs = new ActionResultAsList<DKTangCa>();
            DKTangCa tc = new DKTangCa();

            // Mã nhân viên
            string manv = row[0].ToString().Trim();
            if (String.IsNullOrEmpty(manv))
                rs.AddException(new Exception("Không đúng định dạng mã nhân viên. "));
            else
                tc.MaNhanVien = manv;
            string matc = row[1].ToString().Trim();

            // Mã tăng ca
            if (String.IsNullOrEmpty(matc))
                rs.AddException(new Exception("Không đúng định dạng mã tăng ca. "));
            else
                tc.MaTangCa = matc;

            // Ngày đăng ký
            try
            {
                tc.NgayDangKy = Convert.ToDateTime(row[2].ToString().Trim());
            }
            catch
            {
                rs.AddException(new Exception("Không đúng định dạng ngày đăng ký. "));
            }
            
            rs.ObjectList.Add(tc);
            return rs;
        }


        public ActionResultAsList<DKTangCa> ThemDanhSachDKTangCa(DataTable Table)
        {
            ActionResultAsList<DKTangCa> rs = new ActionResultAsList<DKTangCa>();
            int dem = 0;
            foreach (DataRow r in Table.Rows)
            {
                ActionResultAsList<DKTangCa> re = Parser(r);
                string error = "Dòng " + dem + ":\n";
                if (!re.Success)
                {
                    error += re.ToString();
                }
                else
                {
                    ActionResult ss = ThemDKTangCa(re.ObjectList[0]);
                    if (ss.Success)
                    {

                        rs.ObjectList.Add(re.ObjectList[0]);
                    }
                    else
                    {
                        error += ss.ToString();
                    }
                }
                if (error != "Dòng " + dem++ + ":\n")
                    rs.AddException(new Exception(error));
            }
            return rs;
        }

        public ActionResult ThemDanhSachDKTangCa(List<DKTangCa> dsDangKy)
        {
            ActionResult rs = new ActionResult();
            foreach (DKTangCa dk in dsDangKy)
            {
                DKTangCa tc = new DKTangCa();
                tc.MaNhanVien = dk.MaNhanVien;
                tc.MaTangCa = dk.MaTangCa;
                tc.NgayDangKy = dk.NgayDangKy;
                var rs1 = ThemDKTangCa(tc);
                if (!rs1.Success)
                    return rs1;
            }
            return rs;
        }

        public ActionResult ThemDKTangCa(DKTangCa entity)
        {
            ActionResult rs = new ActionResult();
            using (QLNVDbContext ctx = new QLNVDbContext())
            {
                try
                {
                    TangCa tc = ctx.TangCas.Where(n => n.MaTangCa == entity.MaTangCa).FirstOrDefault<TangCa>();
                    if (tc != null)
                    {
                        if (tc.NgayBD <= entity.NgayDangKy && entity.NgayDangKy <= tc.NgayKT)
                        {
                            NhanVien nv = ctx.NhanViens.Where(n => n.MaNhanVien == entity.MaNhanVien).FirstOrDefault<NhanVien>();
                            if (nv != null)
                            {

                                ctx.DKTangCas.Add(entity);
                                ctx.SaveChanges();
                            }
                            else
                                rs.AddException(new Exception("Không tồn tại mã nhân viên: " + entity.MaNhanVien + ". "));
                        }
                        else
                            rs.AddException(new Exception("Ngày đăng ký nằm ngoài đợt tăng ca. "));
                    }
                    else
                        rs.AddException(new Exception("Không tồn tại mã tăng ca: " + entity.MaTangCa + "."));
                }
                catch (Exception ex)
                {
                    Logger.Write(ex.Message);
                    rs.AddException(ex);
                }
            }
            return rs;
        }

        public ActionResult CapNhatDKTangCa(DKTangCa entity)
        {
            ActionResult rs = new ActionResult();
            using (QLNVDbContext ctx = new QLNVDbContext())
            {
                try
                {
                    DKTangCa dk = ctx.DKTangCas.Where(d => d.MaDangKy == entity.MaDangKy).FirstOrDefault();
                    if (dk != null)
                    {
                        TangCa tc = ctx.TangCas.Where(n => n.MaTangCa == entity.MaTangCa).FirstOrDefault<TangCa>();
                        if (tc != null)
                        {
                            NhanVien nv = ctx.NhanViens.Where(n => n.MaNhanVien == entity.MaNhanVien).FirstOrDefault<NhanVien>();
                            if (nv != null)
                            {
                                dk.MaNhanVien = entity.MaNhanVien;
                                dk.MaTangCa = entity.MaTangCa;
                                dk.NgayDangKy = entity.NgayDangKy;
                                ctx.SaveChanges();
                            }
                            else
                                rs.AddException(new Exception("Không tồn tại mã nhân viên:" + entity.MaNhanVien + "."));
                        }
                        else
                            rs.AddException(new Exception("Không tồn tại mã tăng ca: " + entity.MaTangCa + "."));
                    }
                    else
                        rs.AddException(new Exception("Không tồn tại mã đăng ký tăng ca."));
                }
                catch (Exception ex)
                {
                    Logger.Write(ex.Message);
                    rs.AddException(ex);
                }
            }
            return rs;
        }

        public ActionResult XoaDKTangCa(int MaDK)
        {
            ActionResult rs = new ActionResult();
            using (QLNVDbContext ctx = new QLNVDbContext())
            {
                try
                {
                    DKTangCa dk = ctx.DKTangCas.Where(k => k.MaDangKy == MaDK).FirstOrDefault<DKTangCa>();
                    if (dk != null)
                    {
                        ctx.Entry(dk).State = System.Data.Entity.EntityState.Deleted;
                        ctx.SaveChanges();
                    }
                    else
                        rs.AddException(new Exception("Không tồn tại mã đăng ký tăng ca."));
                }
                catch (Exception ex)
                {
                    Logger.Write(ex.Message);
                    rs.AddException(ex);
                }
            }
            return rs;
        }

        public ActionResult XoaDKTangCa(string MaTangCa)
        {
            ActionResult rs = new ActionResult();
            using (QLNVDbContext ctx = new QLNVDbContext())
            {
                try
                {
                    var dk = ctx.DKTangCas.Where(k => k.MaTangCa == MaTangCa).ToList<DKTangCa>();
                    foreach (var d in dk)
                        ctx.Entry(d).State = System.Data.Entity.EntityState.Deleted;
                    ctx.SaveChanges();
                }
                catch (Exception ex)
                {
                    Logger.Write(ex.Message);
                    rs.AddException(ex);
                }
            }
            return rs;
        }

        public ActionResult XoaDKTangCa(DateTime ngaybd, DateTime ngaykt)
        {
            ActionResult rs = new ActionResult();
            using (QLNVDbContext ctx = new QLNVDbContext())
            {
                try
                {
                    var dk = ctx.DKTangCas.Where(k => k.NgayDangKy < ngaybd || k.NgayDangKy > ngaykt).ToList<DKTangCa>();
                    foreach (var d in dk)
                        ctx.Entry(d).State = System.Data.Entity.EntityState.Deleted;
                    ctx.SaveChanges();
                }
                catch (Exception ex)
                {
                    Logger.Write(ex.Message);
                    rs.AddException(ex);
                }
            }
            return rs;
        }
    }
}
